#ifndef __XML_WIDGET_H__
#define __XML_WIDGET_H__

#include <gtk/gtk.h>
#include <tinyxml.h>

#include <map>
using namespace std;

namespace xmlWidgetLib
{
	class xmlWidget;
	typedef map< string,xmlWidget* > xmlWidgetMap;
	typedef map< string,string > xmlWidgetActionMap;
	class xmlWidget
	{
	public:
		xmlWidget( const char* xmlPath ) throw( string * );
		~xmlWidget();

		xmlWidget *getParent(void)
		{
			return m_ParentWidget;
		}
		xmlWidget *search( const string &key );
		GtkWidget *getGtkWidget(void)
		{
			return m_Widget;
		}
		GtkWidget *getGtkEmbleWidget(void)
		{
			return m_EmbleWidget;
		}
		string getName( void )
		{
			return m_RootName;
		}
		string getAction( const string &key )
		{
			xmlWidgetActionMap::const_iterator it = m_Actions.find(key);
			if( m_Actions.end() != it )
			{
				return it->second;
			}
			else
			{
				return "";
			}
		}

		void show(void);
		void hide(void);
		void setHidden( bool hide )
		{
			m_hide = hide;
		}

		void dumpTree(void);
		void dumpInfo(const string & info);

	private:
		xmlWidget(){}


		xmlWidget( TiXmlElement* xmlElement ,xmlWidget *parent ) throw( string * );
		void parseXmlRoot(void) throw( string * );
		void parseXmlChildWidget(void) throw( string * );
		void parseXmlAction(void) throw( string * );



		void parseXmlMainWindow(void) throw( string * );
		void parseXmlSubWindow(void) throw( string * );
	
		void parseXmlMainMenu(void) throw( string * );
		void parseXmlPopMenu(void) throw( string * );
		void parseXmlMenu(void) throw( string * );
		void parseXmlMenuItem(void) throw( string * );

		void parseXmlFileSelection(void) throw( string * );




	protected:
		TiXmlElement		*m_XmlRoot;
		TiXmlDocument		*m_Doc;

		string				m_RootName;
		GtkWidget			*m_Widget;
		GtkWidget			*m_EmbleWidget;
		bool				m_hide;

		xmlWidgetActionMap	m_Actions;
		
		xmlWidget			*m_ParentWidget;
		xmlWidgetMap		m_SubWidgets;
		int					m_level;
/*
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*/
		const static string	m_ScriptPath;

/*
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*******************************************************************************************
*/
	friend void FileSelectionDestroy_CallBack ( GtkWidget * ,gpointer );

	};
};
#endif // __XML_WIDGET_H__
